home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adasmall / eat-sem.ada < prev    next >
Text File  |  1996-01-30  |  6KB  |  235 lines

  1. with  SMALL_SP;
  2. use  SMALL_SP;
  3. procedure EAT is
  4.     
  5.     SCREEN: SEMAPHORE := 1;
  6.  
  7.     task DIJKSTRA is
  8.       entry GIVE_BIRTH;
  9.     end DIJKSTRA;    
  10.  
  11.     task LISKOV is
  12.       entry GIVE_BIRTH;
  13.     end LISKOV; 
  14.  
  15.     task SAMMET is
  16.       entry GIVE_BIRTH;
  17.     end SAMMET;
  18.  
  19.     task GEHANI is
  20.       entry GIVE_BIRTH;
  21.     end GEHANI; 
  22.  
  23.     task CHOPSTICK1 is
  24.       entry PICKUP;
  25.       entry PUTDOWN;
  26.     end CHOPSTICK1; 
  27.  
  28.     task CHOPSTICK2 is
  29.       entry PICKUP;
  30.       entry PUTDOWN;
  31.     end CHOPSTICK2; 
  32.  
  33.     task CHOPSTICK3 is
  34.       entry PICKUP;
  35.       entry PUTDOWN;
  36.     end CHOPSTICK3;
  37.  
  38.     task CHOPSTICK4 is
  39.       entry PICKUP;
  40.       entry PUTDOWN;
  41.     end CHOPSTICK4;
  42.  
  43.     NO_MEALS : integer := 3;
  44.   
  45.     task body DIJKSTRA is
  46.        LENGTH_OF_MEAL: FLOAT;
  47.     begin
  48.         accept GIVE_BIRTH do
  49.           WAIT(SCREEN);
  50.           PUT("Eddy Dijkstra living and breathing");
  51.           NEW_LINE;
  52.           SIGNAL(SCREEN);
  53.         end GIVE_BIRTH;
  54.       for x in 1..NO_MEALS loop
  55.         CHOPSTICK1.PICKUP;
  56.         CHOPSTICK2.PICKUP;
  57.         LENGTH_OF_MEAL := RANDOM(9) + 1;
  58.         WAIT(SCREEN);
  59.         PUT("Eddy Dijkstra eating meal"); PUT(x:2);
  60.         PUT(" with chopsticks 1 and 2");
  61.         PUT(" for"); PUT(LENGTH_OF_MEAL:2:0); PUT(" seconds");
  62.         NEW_LINE;
  63.         SIGNAL(SCREEN);
  64.         delay LENGTH_OF_MEAL;
  65.         WAIT(SCREEN);
  66.         PUT("Eddy Dijkstra done");
  67.         NEW_LINE;
  68.         SIGNAL(SCREEN);
  69.         CHOPSTICK1.PUTDOWN;
  70.         CHOPSTICK2.PUTDOWN;
  71.         delay 5.0;
  72.       end loop;
  73.       WAIT(SCREEN);
  74.       PUT("Eddy Dijkstra burp");
  75.       NEW_LINE;
  76.       SIGNAL(SCREEN);
  77.     end DIJKSTRA;
  78.    
  79.     task body LISKOV is
  80.         LENGTH_OF_MEAL: FLOAT;
  81.     begin
  82.         accept GIVE_BIRTH do
  83.           WAIT(SCREEN);
  84.           PUT(" Barbie Liskov living and breathing");
  85.           NEW_LINE;
  86.           SIGNAL(SCREEN);
  87.         end GIVE_BIRTH;
  88.       for x in 1..NO_MEALS loop
  89.         CHOPSTICK2.PICKUP;
  90.         CHOPSTICK3.PICKUP;
  91.         LENGTH_OF_MEAL := RANDOM(9) + 1;
  92.         WAIT(SCREEN);
  93.         PUT(" Barbie Liskov eating meal"); PUT(x:2);
  94.         PUT(" with chopsticks 2 and 3");
  95.         PUT(" for"); PUT(LENGTH_OF_MEAL:2:0); PUT(" seconds");
  96.         NEW_LINE;
  97.         SIGNAL(SCREEN);
  98.         delay LENGTH_OF_MEAL;
  99.         WAIT(SCREEN);
  100.         PUT(" Barbie Liskov done");
  101.         NEW_LINE;
  102.         SIGNAL(SCREEN);
  103.         CHOPSTICK2.PUTDOWN;
  104.         CHOPSTICK3.PUTDOWN;
  105.         delay 5.0;
  106.       end loop;
  107.       WAIT(SCREEN);
  108.       PUT(" Barbie Liskov burp");
  109.       NEW_LINE;
  110.       SIGNAL(SCREEN);
  111.     end LISKOV;
  112.     
  113.     task body SAMMET is
  114.         LENGTH_OF_MEAL: FLOAT;
  115.     begin
  116.         accept GIVE_BIRTH do
  117.           WAIT(SCREEN);
  118.           PUT("  Jeannie Sammet living and breathing");
  119.           NEW_LINE;
  120.           SIGNAL(SCREEN);
  121.         end GIVE_BIRTH;
  122.       for x in 1..NO_MEALS loop
  123.         CHOPSTICK3.PICKUP;
  124.         CHOPSTICK4.PICKUP;
  125.         LENGTH_OF_MEAL := RANDOM(9) + 1;
  126.         WAIT(SCREEN);
  127.         PUT("  Jeannie Sammet eating meal"); PUT(x:2);
  128.         PUT(" with chopsticks 3 and 4");
  129.         PUT(" for"); PUT(LENGTH_OF_MEAL:2:0); PUT(" seconds");
  130.         NEW_LINE;
  131.         SIGNAL(SCREEN);
  132.         delay LENGTH_OF_MEAL;
  133.         WAIT(SCREEN);
  134.         PUT("  Jeannie Sammet done");
  135.         NEW_LINE;
  136.         SIGNAL(SCREEN);
  137.         CHOPSTICK3.PUTDOWN;
  138.         CHOPSTICK4.PUTDOWN;
  139.         delay 5.0;
  140.       end loop;
  141.       WAIT(SCREEN);
  142.       PUT("  Jeannie Sammet burp");
  143.       NEW_LINE;
  144.       SIGNAL(SCREEN);
  145.     end SAMMET;
  146.   
  147.     task body GEHANI is
  148.         LENGTH_OF_MEAL : FLOAT;
  149.     begin
  150.         accept GIVE_BIRTH do
  151.           WAIT(SCREEN);
  152.           PUT("   Narain Gehani living and breathing");
  153.           NEW_LINE;
  154.           SIGNAL(SCREEN);
  155.         end GIVE_BIRTH;
  156.       for x in 1..NO_MEALS loop
  157.         CHOPSTICK1.PICKUP;
  158.         CHOPSTICK4.PICKUP;
  159.         LENGTH_OF_MEAL := RANDOM(9) + 1;
  160.         WAIT(SCREEN);
  161.         PUT("   Narain Gehani eating meal"); PUT(x:2);
  162.         PUT(" with chopsticks 1 and 4");
  163.         PUT(" for"); PUT(LENGTH_OF_MEAL:2:0); PUT(" seconds");
  164.         NEW_LINE;
  165.         SIGNAL(SCREEN);
  166.         delay LENGTH_OF_MEAL;
  167.         WAIT(SCREEN);
  168.         PUT("   Narain Gehani done");
  169.         NEW_LINE;
  170.         SIGNAL(SCREEN);
  171.         CHOPSTICK1.PUTDOWN;
  172.         CHOPSTICK4.PUTDOWN;
  173.         delay 5.0;
  174.       end loop;
  175.       WAIT(SCREEN);
  176.       PUT("   Narain Gehani burp");
  177.       NEW_LINE;
  178.       SIGNAL(SCREEN);
  179.     end GEHANI;
  180.    
  181.   task body CHOPSTICK1 is
  182.     begin
  183.       loop
  184.         select
  185.           accept PICKUP;
  186.           accept PUTDOWN;
  187.         or
  188.           terminate;
  189.         end select;
  190.       end loop;
  191.     end CHOPSTICK1;  
  192.  
  193.   task body CHOPSTICK2 is
  194.     begin
  195.       loop
  196.         select
  197.           accept PICKUP;
  198.           accept PUTDOWN;
  199.         or
  200.           terminate;
  201.         end select;
  202.       end loop;
  203.     end CHOPSTICK2; 
  204.  
  205.   task body CHOPSTICK3 is
  206.     begin
  207.       loop
  208.         select
  209.           accept PICKUP;
  210.           accept PUTDOWN;
  211.         or
  212.           terminate;
  213.         end select;
  214.       end loop;
  215.     end CHOPSTICK3; 
  216.  
  217.   task body CHOPSTICK4 is
  218.     begin
  219.       loop
  220.         select
  221.           accept PICKUP;
  222.           accept PUTDOWN;
  223.         or
  224.           terminate;
  225.         end select;
  226.       end loop;
  227.     end CHOPSTICK4;
  228.  
  229. begin
  230.   DIJKSTRA.GIVE_BIRTH;
  231.   LISKOV.GIVE_BIRTH;
  232.   SAMMET.GIVE_BIRTH;
  233.   GEHANI.GIVE_BIRTH;
  234. end EAT;
  235.